class PromptBuilder:
    """
    用于构建提示词的类。
    """

    def __init__(self, prompt_template=None):
        """
        初始化PromptBuilder。

        参数:
            prompt_template (str, optional): 提示词模板字符串。默认为None。
        """
        self.prompt_template = prompt_template or """
        你是一个问答机器人。
        你的任务是根据下述给定的已知信息回答用户问题。
        如果提供的信息不足以回答问题，请直接回答'我暂时无法回答这个问题'。
        已知信息:
        {context}

        用户问:
        {query}
        """

    def build_prompt(self, **kwargs):
        """
        根据模板和输入参数构建提示词。

        参数:
            **kwargs: 动态参数，用于填充模板中的占位符。

        返回:
            str: 填充后的提示词字符串。
        """
        inputs = {}  # 创建一个空字典，用于存储处理后的输入参数

        # 遍历kwargs中的每个键值对
        for k, v in kwargs.items():
            # 检查当前值是否是列表，并且列表中的所有元素都是字符串
            if isinstance(v, list) and all(isinstance(elem, str) for elem in v):
                val = "\n\n".join(v)  # 如果是字符串列表，将其拼接为一个字符串，段落之间用两个换行符分隔
            else:
                val = v  # 如果不是字符串列表，直接使用原始值
            inputs[k] = val  # 将处理后的值存入inputs字典中

        # 使用inputs字典中的值填充prompt_template中的占位符，并返回填充后的字符串
        return self.prompt_template.format(**inputs)

    def set_template(self, prompt_template):
        """
        设置自定义的提示词模板。

        参数:
            prompt_template (str): 新的提示词模板字符串。
        """
        self.prompt_template = prompt_template

## -----------------调用示例------------------
#1. 使用默认模板
# 创建PromptBuilder实例
# prompt_builder = PromptBuilder()
#
# # 定义上下文和用户问题
# context = [
#     "人工智能是模拟人类智能的技术。",
#     "它可以通过机器学习算法进行训练。"
# ]
# query = "什么是人工智能？"
#
# # 构建提示词
# prompt = prompt_builder.build_prompt(context=context, query=query)
#
# # 打印生成的提示词
# print(prompt)



#2. 使用自定义模板
# 创建PromptBuilder实例
# prompt_builder = PromptBuilder()
#
# # 设置自定义模板
# custom_template = """
# 根据以下信息回答问题：
#
# 信息:
# {context}
#
# 问题:
# {query}
# """
# prompt_builder.set_template(custom_template)
#
# # 定义上下文和用户问题
# context = [
#     "Python是一种高级编程语言。",
#     "它广泛用于数据科学和人工智能领域。"
# ]
# query = "Python有哪些应用场景？"
#
# # 构建提示词
# prompt = prompt_builder.build_prompt(context=context, query=query)
#
# # 打印生成的提示词
# print(prompt)